home *** CD-ROM | disk | FTP | other *** search
/ Inter.Net 55-2 / Inter.Net 55-2.iso / Mandrake / mdkinst / usr / bin / perl-install / resize_fat / directory.pm < prev    next >
Encoding:
Perl POD Document  |  2000-01-12  |  1.5 KB  |  80 lines

  1. package resize_fat::directory;
  2.  
  3.  
  4.  
  5.  
  6. use common qw(:system);
  7. use resize_fat::dir_entry;
  8. use resize_fat::io;
  9.  
  10.  
  11. my $format = "a8 a3 C C C S7 I";
  12. my @fields = (
  13.     'name',
  14.     'extension',
  15.     'attributes',
  16.     'is_upper_case_name',
  17.     'creation_time_low',    
  18.     'creation_time_high',
  19.     'creation_date',
  20.     'access_date',
  21.     'first_cluster_high',    
  22.     'time',
  23.     'date',
  24.     'first_cluster',
  25.     'length',
  26. );
  27. my $psizeof_format = psizeof($format);
  28.  
  29. 1;
  30.  
  31. sub entry_size { $psizeof_format }
  32.  
  33.  
  34.  
  35. sub traverse($$) {
  36.     my ($directory, $f) = @_;
  37.  
  38.     for (my $i = 0;; $i++) {
  39.     my $raw = \substr($directory, $i * $psizeof_format, $psizeof_format);
  40.  
  41.     
  42.     $$raw =~ /^\0*$/ and return $directory;
  43.  
  44.     my $entry; @{$entry}{@fields} = unpack $format, $$raw;
  45.  
  46.     &$f($entry)
  47.         and    $$raw = pack $format, @{$entry}{@fields};
  48.     }
  49.     $directory;
  50. }
  51.  
  52. sub traverse_all($$) {
  53.     my ($fs, $f) = @_;
  54.  
  55.     my $traverse_all; $traverse_all = sub {
  56.     my ($entry) = @_;
  57.  
  58.     &$f($entry);
  59.  
  60.         resize_fat::dir_entry::is_directory($entry)
  61.         and traverse(resize_fat::io::read_file($fs, resize_fat::dir_entry::get_cluster($entry)), $traverse_all);
  62.  
  63.     undef; 
  64.     };
  65.  
  66.     my $directory = $resize_fat::isFAT32 ?
  67.     resize_fat::io::read_file($fs, $fs->{fat32_root_dir_cluster}) :
  68.     resize_fat::io::read($fs, $fs->{root_dir_offset}, $fs->{root_dir_size});
  69.     traverse($directory, $traverse_all);
  70.     undef $traverse_all; 
  71. }
  72.  
  73.  
  74.  
  75.  
  76. sub remap($$) {
  77.     my ($fs, $directory) = @_;
  78.     traverse($directory, \&resize_fat::dir_entry::remap);
  79. }
  80.